/**
 * Thai Character Cluster (TCC)
 */
grammar TCC;

options {
output=AST;
ASTLabelType=CommonTree;
}

tokens {
CLUSTER_TCC;	// TCC
CLUSTER_ATCC; 	// After TCC
CLUSTER_BTCC; 	// Before TCC
CLUSTER_WS;  	// whitespaces
CLUSTER_SYMBOL;  	// symbols
CLUSTER_TDIGITS;	// Thai digits
CLUSTER_ADIGITS;	// Arabic digits
CLUSTER_OTHERS;  	// the rest
}

@members {
ArrayList list = new ArrayList();
}

@header {
package net.siit.ling;
}

@lexer::header {
package net.siit.ling;
}

// digits
ADIGIT	:	'0'..'9'
	;
TDIGIT	:	'\u0e50'..'\u0e59'
	;

// symbols
SYMBOL	:	'?' | '!' | '.' | ',' | ':' | ';'
	|	'/' | '\\' | '\'' | '\"'
	|	'<' | '>' | '(' | ')' | '[' | ']'
	|	'$' | '&'
	|	'=' | '+' | '-' | '*' | '%'
	|	'_' | '@' | '#' | '~' | '^' | '|'
	;

// white spaces
WS	:	HSPACE | VSPACE
	;
HSPACE	:	SPACE | TAB
	;
VSPACE	:	NEWLINE | FEED | FORMFEED
	;
SPACE	:	' '
	;
TAB	:	'\t'
	;
NEWLINE	:	'\n'
	;
FEED	:	'\r'
	;
FORMFEED 
	:	'\u000C'
	;

// Non-Thai characters
NONTHAI :	~('\u0e00'..'\u0eff' | WS | SYMBOL | ADIGIT )
	;
		
// Thai characters - all
//TCHAR	:	'\u0e00'..'\u0eff'
//	;

// Thai tonemarks
TONE	:	'\u0e48'..'\u0e4b'
	;
	
// Thai vowels
A	:	'\u0e30'
	;
HANAKAT	:	'\u0e31'
	;
AA	:	'\u0e32'
	;
AM	:	'\u0e33'
	;
I	:	'\u0e34'
	;
II	:	'\u0e35'
	;
UE	:	'\u0e36'
	;
UEE	:	'\u0e37'
	;
U	:	'\u0e38'
	;
UU	:	'\u0e39'
	;
E	:	'\u0e40'
	;
AE	:	'\u0e41'
	;
O	:	'\u0e42'
	;
MUAN	:	'\u0e43'
	;
MALAI	:	'\u0e44'
	;
LAKKHANGYAO
	:	'\u0e45'
	;
RU	:	'\u0e24'
	;
LU	:	'\u0e26'
	;

// Thai symbols
PAIYANNOI	:	'\u0e2f'
	;
PHINTHU	:	'\u0e3a'
	;
YAMOK	:	'\u0e46'
	;
TAIKHU	:	'\u0e47'
	;
THANTHAKHAT
	:	'\u0e4c'
	;
NIKHAHIT	:	'\u0e4d'
	;
YAMAKKAN	:	'\u0e4e'
	;
FONGMAN	:	'\u0e4f'
	;
ANGKHANKHU
	:	'\u0e5a'
	;
KHOMUT	:	'\u0e5b'
	;

// Thai consonants
KAI	:	'\u0e01'
	;
KHAI	:	'\u0e02'
	;
KHUAT	:	'\u0e03'
	;
KHWAI	:	'\u0e04'
	;
KHON	:	'\u0e05'
	;
RAKHANG	:	'\u0e06'
	;
NGU	:	'\u0e07'
	;
CHAN	:	'\u0e08'
	;
CHING	:	'\u0e09'
	;
CHANG	:	'\u0e0a'
	;
SO	:	'\u0e0b'
	;
CHOE	:	'\u0e0c'
	;
YING	:	'\u0e0d'
	;
CHADA	:	'\u0e0e'
	;
PATAK	:	'\u0e0f'
	;
THAN	:	'\u0e10'
	;
NANGMONTHO
	:	'\u0e11'
	;
PHUTHAO	:	'\u0e12'
	;
NEN	:	'\u0e13'
	;
DEK	:	'\u0e14'
	;
TAO	:	'\u0e15'
	;
THUNG	:	'\u0e16'
	;
THAHAN	:	'\u0e17'
	;
THONG	:	'\u0e18'
	;
NU	:	'\u0e19'
	;
BAIMAI	:	'\u0e1a'
	;
PLA	:	'\u0e1b'
	;
PHUNG	:	'\u0e1c'
	;
FA	:	'\u0e1d'
	;
PHAN	:	'\u0e1e'
	;
FAN	:	'\u0e1f'
	;
SAMPHAO	:	'\u0e20'
	;
MA	:	'\u0e21'
	;
YAK	:	'\u0e22'
	;
RUA	:	'\u0e23'
	;
LING	:	'\u0e25'
	;
WAEN	:	'\u0e27'
	;
SALA	:	'\u0e28'
	;
RUSI	:	'\u0e29'
	;
SUA	:	'\u0e2a'
	;
HIP	:	'\u0e2b'
	;
CHULA	:	'\u0e2c'
	;
ANG	:	'\u0e2d'
	;
NOKHUK	:	'\u0e2e'
	;

/* Production rules */
s	:	( tcc | abtcc | others | symbols | adigits | tdigits | whitespaces )*
	;

others	:	NONTHAI+ -> ^(CLUSTER_OTHERS NONTHAI+)
	;
symbols	:	SYMBOL -> ^(CLUSTER_SYMBOL SYMBOL)
	;
adigits :	ADIGIT+ -> ^(CLUSTER_ADIGITS ADIGIT+)
	;
tdigits	:	TDIGIT+ -> ^(CLUSTER_TDIGITS TDIGIT+)
	;
whitespaces :	WS+ -> ^(CLUSTER_WS WS+)
	;

//tccss	:	( tcc | HSPACE | VSPACE | DIGITS | SYMBOL )*
//tccs	:	( tcc | abtcc )+
//	;
tcc 	:	( c abv? kill ) -> ^(CLUSTER_TCC c abv? kill)
	|	( c abv TONE? ) -> ^(CLUSTER_TCC c abv TONE?)
	|	( c sv ) -> ^(CLUSTER_TCC c sv)
	|	( c TAIKHU ) -> ^(CLUSTER_TCC c TAIKHU)
	|	( c hanakat_c ) -> ^(CLUSTER_TCC c hanakat_c)
	| 	( c TONE? fv? ) -> ^(CLUSTER_TCC c TONE? fv?)
	|	( E c I e_i_opt ) -> ^(CLUSTER_TCC E c I e_i_opt)
	|	( E c II e_ii_opt ) -> ^(CLUSTER_TCC E c II e_ii_opt)
	|	( E c UEE e_uee_opt ) -> ^(CLUSTER_TCC E c UEE e_uee_opt)
	|	( E c e_opt ) -> ^(CLUSTER_TCC E c e_opt)
	|	( AE c ae_opt ) -> ^(CLUSTER_TCC AE c ae_opt)
	|	( O c o_opt ) -> ^(CLUSTER_TCC O c o_opt)
	|	( lv c TONE? ~fv ) -> ^(CLUSTER_TCC lv c TONE?)
	|	( sv ) -> ^(CLUSTER_TCC sv)
	|	( tsymbol ) -> ^(CLUSTER_TCC tsymbol)
//	)	{ list.add(new String($tcc.text)); }
	;

abtcc 	:	fv -> ^(CLUSTER_ATCC fv)
	|	lv -> ^(CLUSTER_BTCC lv)
	|	abv -> ^(CLUSTER_ATCC abv)
	|	hanakat_c -> ^(CLUSTER_ATCC hanakat_c)
	|	kill -> ^(CLUSTER_ATCC kill)
	;
			
hanakat_c	:	HANAKAT TONE? c (A | I | U)?
	|	HANAKAT TONE? c
	|	HANAKAT TONE?
	;
e_opt	:	c TONE? AA A
	|	TONE? AA A?
	|	TONE? A
	|	TAIKHU c
	;
e_i_opt	:	TONE? (c kill)? c
	;
e_ii_opt	:	TONE? YAK A?
	;
e_uee_opt
	:	TONE? ANG A?
	;
ae_opt	:	TONE? A
	|	TAIKHU c
	;
o_opt	:	TONE? A
	;
c	:	KAI | KHAI | KHUAT | KHWAI | KHON
	|	RAKHANG | NGU | CHAN | CHING | CHANG
	|	SO | CHOE | YING | CHADA | PATAK
	|	THAN | NANGMONTHO | PHUTHAO | NEN | DEK
	|	TAO | THUNG | THAHAN | THONG | NU
	|	BAIMAI | PLA | PHUNG | FA | PHAN
	|	FAN | SAMPHAO | MA | YAK | RUA
	|	LING | WAEN | SALA | RUSI | SUA
	|	HIP | CHULA | ANG | NOKHUK
	;
fv	:	A | AA | AM
	|	LAKKHANGYAO
	|	NIKHAHIT AA  // NIKHAHIT+AA = AM
	;
lv	:	E | AE | O | MUAN | MALAI
	;
abv	:	I | II | UE | UEE | U | UU | TAIKHU | NIKHAHIT | PHINTHU
	;
sv	:	(RU | LU) LAKKHANGYAO?
	;
kill	:	THANTHAKHAT
	|	YAMAKKAN
	;
paiyanyai	:	PAIYANNOI LING PAIYANNOI
	;
tsymbol	:	FONGMAN
	|	ANGKHANKHU
	|	KHOMUT
	|	paiyanyai
	|	PAIYANNOI
	|	YAMOK
	;
